package com.itheima.functioninterface;

import java.util.function.Predicate;

/**
 * <h1>JDK内置断言函数式接口 Predicate</h1>
 *
 * @author <a href="11n_yd2h5e1jx8@dingtalk.com">叶世铭</a>
 * @since 2024/1/29
 */
public class PredicateDemo {

    public static void main(String[] args) {
        testName(s -> s.length() > 3, "张三");

        testAnd(
                s -> s.contains("A"),
                s -> s.contains("B"),
                "ABC"
        );

        testAnd(
                s -> s.contains("A"),
                s -> s.contains("B"),
                "Abc"
        );

        testOr(
                s -> s.contains("Z"),
                s -> s.contains("Y"),
                "Zxc"
        );

        testOr(
                s -> s.contains("Z"),
                s -> s.contains("Y"),
                "zxc"
        );

        testNegate(
                s -> s.contains("Q"),
                "iQ"
        );
        testNegate(
                s -> s.contains("Q"),
                "asd"
        );
    }

    /**
     * 使用Lambda表达式判断 名字长度是否超过3个字
     */
    private static void testName(Predicate<String> predicate, String name) {
        System.out.println(predicate.test(name) ? "超过3个字" : "没有超过3个字");
    }

    /**
     * 使用Lambda表达式判断一个字符中，包含A，包含B
     * 使用了Predicate 中的 and 与
     * default Predicate<T> and(Predicate<? super T> other) {
     * Objects.requireNonNull(other);
     * return (t) -> test(t) && other.test(t);
     * }
     */
    private static void testAnd(Predicate<String> p1, Predicate<String> p2, String str) {
        System.out.println(p1.and(p2).test(str) ? "yes" : "no");
    }

    /**
     * 使用Lambda表达式判断一个字符中，可能包含Z 或者 可能 包含Y
     * 使用了Predicate 中的 or 或
     * default Predicate<T> or(Predicate<? super T> other) {
     * Objects.requireNonNull(other);
     * return (t) -> test(t) || other.test(t);
     * }
     */
    private static void testOr(Predicate<String> p1, Predicate<String> p2, String str) {
        System.out.println(p1.or(p2).test(str) ? "可能包含Z 或者 可能 包含Y" : "不包含Z 不包含Y");
    }

    /**
     * 使用Lambda表达式判断一个字符中，可能不包含Q
     * 使用了Predicate 中的
     * default Predicate<T> negate() {
     * return (t) -> !test(t);
     * }
     */

    private static void testNegate(Predicate<String> p1, String str) {
        System.out.println(p1.negate().test(str) ? "不包含Q" : "包含Q");
    }
}
